/**
   Date     : 2022-11-22
   com5      mega
*/

#include "main.h"

// 全局区
extern DallasTemperature PHSensor; // 需要对PHSensor对象初始化
String receiveEsp_data = "";       // 用于接收esp的数据 aly属性下发
float Temperature = 0;             // 温度
float Humidity = 0;                // 湿度
float Turbidity = 0;               // 浊度
float PH = 0;                      // PH值
float Hardness = 0;                // 硬度
float Sulfate = 0;                 // 硫酸盐

/**
 * 蜂鸣器报警
 */
void buzzerOn()
{
    digitalWrite(pinBuzzer, BUZZER_ON);
    delay(1000); //等待1000毫秒
    digitalWrite(pinBuzzer, BUZZER_OFF);
}

/**
 * 判断PH 浊度是否超标
 * 参数 : 阿里云下发的PHMAx PHMIN TUMAX 构成的jsonStr
 */

void isOutStandard(String jsonStandardStr)
{
    StaticJsonDocument<1024> jsonEspData;
    DeserializationError error = deserializeJson(jsonEspData, jsonStandardStr);
    if (error)
    {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
        return;
    }

    float phMax = float(jsonEspData[PH_MAX_ID]);
    float phMin = float(jsonEspData[PH_MIN_ID]);
    float tuMax = float(jsonEspData[TU_MAX_ID]);

    if (PH > phMax)
    {
        Serial.print("当前PH值为: " + String(PH) + "");
        Serial.print("----PH 超过预设的最大值");
        Serial.println("----PH最大值为: " + String(phMax) + "");
    }
    else if (PH < phMin)
    {
        Serial.print("当前PH值为: " + String(PH) + "");
        Serial.print("----PH小于预设最小值");
        Serial.println("----PH最小值为: " + String(phMin) + "");
    }
    else if (Turbidity > tuMax)
    {
        Serial.print("当前浊度值为: " + String(Turbidity) + "");
        Serial.print("----浊度超过预设最大值");
        Serial.println("----浊度最大值为: " + String(tuMax) + "");
    }
    if (PH > phMax || PH < phMin || Turbidity > tuMax)
    {
        buzzerOn(); //开启蜂鸣器
    }
}

/**
   将采集的数据通过串口传输给esp8266
*/
void sendDataToEsp()
{
    // 温度
    Temperature = getTemperature();
    // 湿度
    Humidity = getHumidity();
    // 浊度
    Turbidity = getTurbidity(Temperature);
    // PH值
    PH = getPH(Temperature);
    // 硬度
    float floatHardnessArray[5] = {166, 235, 315, 453, 566}; // 定义一个float数组
    Hardness = floatHardnessArray[random(0, 5)];             // 获取随机数值
    // 硫酸盐
    float floatSulfateArray[5] = {320, 369, 455.32, 666, 552}; // 定义一个float数组
    Sulfate = floatSulfateArray[random(0, 5)];

    // Serial.println("Sulfate : " + String(Sulfate) + "");

    StaticJsonDocument<2048> jsonData;                                   // 构建json
    jsonData[FLOAT_Temperature_ID] = serialized(String(Temperature, 2)); // 给单精度浮点型测试属性此键赋值，保留2位小数
    jsonData[FLOAT_Humidity_ID] = serialized(String(Humidity, 2));
    jsonData[FLOAT_Turbidity_ID] = serialized(String(Turbidity, 2));
    jsonData[FLOAT_PH_ID] = serialized(String(PH, 2));
    jsonData[FLOAT_Hardness_ID] = serialized(String(Hardness, 2));
    jsonData[FLOAT_Sulfate_ID] = serialized(String(Sulfate, 2));
    String data = "";
    serializeJson(jsonData, data); // 将JSON对象转换成字符串，序列化Json
    // Serial.print("采集到的数据为: ");
    Serial.println(data);
    Serial1.println(data); //将数据以json字符串形式通过串口一发送给esp8266
    while (1)
    {
        if (Serial1.available() > 0)
        {

            if (Serial1.peek() != '\n') // peek并不会将数据从缓冲区清除
            {
                receiveEsp_data += char(Serial1.read());
            }
            else
            {
                Serial1.read(); //将'\n'从缓冲区清除
                isOutStandard(receiveEsp_data);
                receiveEsp_data = ""; //清空全局变量
                return;
            }
        }
    }
}
/**
 *初始化函数
 */
void setup()
{
    // put your setup code here, to run once:
    Serial.begin(9600);
    Serial1.begin(9600);
    pinMode(pinBuzzer, OUTPUT);          //蜂鸣器初始化
    digitalWrite(pinBuzzer, BUZZER_OFF); //初始化不出声
    PHSensor.begin();                    // ph传感器对象初始化
}
/**
 * 主循环
 */
void loop()
{
    // 将采集的数据发送给 ESP8266
    sendDataToEsp();
}
